package com.zenithmind.classroom.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.classroom.pojo.dto.CourseCreateDTO;
import com.zenithmind.classroom.pojo.dto.CourseQueryDTO;
import com.zenithmind.classroom.pojo.dto.CourseUpdateDTO;
import com.zenithmind.classroom.pojo.domain.Course;
import com.zenithmind.classroom.pojo.vo.CourseDetailVO;
import com.zenithmind.classroom.pojo.vo.CourseStatisticsVO;
import com.zenithmind.classroom.pojo.vo.CourseVO;

import java.util.List;

/**
 * 课程服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface CourseService extends IService<Course> {

    /**
     * 创建课程
     * 
     * @param createDTO 创建DTO
     * @return 课程VO
     */
    CourseVO createCourse(CourseCreateDTO createDTO);

    /**
     * 更新课程
     * 
     * @param id 课程ID
     * @param updateDTO 更新DTO
     * @return 是否成功
     */
    Boolean updateCourse(String id, CourseUpdateDTO updateDTO);

    /**
     * 删除课程
     * 
     * @param id 课程ID
     * @return 是否成功
     */
    Boolean deleteCourse(String id);

    /**
     * 发布课程
     * 
     * @param id 课程ID
     * @return 是否成功
     */
    Boolean publishCourse(String id);

    /**
     * 下架课程
     * 
     * @param id 课程ID
     * @return 是否成功
     */
    Boolean unpublishCourse(String id);

    /**
     * 分页查询课程
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    PageResult<CourseVO> getCoursePage(CourseQueryDTO queryDTO);

    /**
     * 获取课程详情
     * 
     * @param id 课程ID
     * @param userId 用户ID
     * @return 课程详情
     */
    CourseDetailVO getCourseDetail(String id, String userId);

    /**
     * 获取推荐课程
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 课程列表
     */
    List<CourseVO> getRecommendCourses(String userId, Integer limit);

    /**
     * 获取热门课程
     * 
     * @param limit 限制数量
     * @return 课程列表
     */
    List<CourseVO> getHotCourses(Integer limit);

    /**
     * 获取最新课程
     * 
     * @param limit 限制数量
     * @return 课程列表
     */
    List<CourseVO> getLatestCourses(Integer limit);

    /**
     * 搜索课程
     * 
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 课程列表
     */
    List<CourseVO> searchCourses(String keyword, Integer limit);

    /**
     * 获取用户课程
     * 
     * @param userId 用户ID
     * @param status 状态
     * @param limit 限制数量
     * @return 课程列表
     */
    List<CourseVO> getUserCourses(String userId, Integer status, Integer limit);

    /**
     * 获取讲师课程
     * 
     * @param instructorId 讲师ID
     * @param limit 限制数量
     * @return 课程列表
     */
    List<CourseVO> getInstructorCourses(String instructorId, Integer limit);

    /**
     * 获取分类课程
     * 
     * @param categoryId 分类ID
     * @param limit 限制数量
     * @return 课程列表
     */
    List<CourseVO> getCategoryCourses(String categoryId, Integer limit);

    /**
     * 获取相关课程
     * 
     * @param courseId 课程ID
     * @param limit 限制数量
     * @return 课程列表
     */
    List<CourseVO> getRelatedCourses(String courseId, Integer limit);

    /**
     * 收藏课程
     * 
     * @param courseId 课程ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean favoriteCourse(String courseId, String userId);

    /**
     * 取消收藏课程
     * 
     * @param courseId 课程ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean unfavoriteCourse(String courseId, String userId);

    /**
     * 获取收藏课程
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 课程列表
     */
    List<CourseVO> getFavoriteCourses(String userId, Integer limit);

    /**
     * 评价课程
     * 
     * @param courseId 课程ID
     * @param userId 用户ID
     * @param rating 评分
     * @param comment 评价内容
     * @return 是否成功
     */
    Boolean rateCourse(String courseId, String userId, Integer rating, String comment);

    /**
     * 更新课程统计
     * 
     * @param courseId 课程ID
     * @param studentCount 学生数增量
     * @param completedCount 完成数增量
     * @return 是否成功
     */
    Boolean updateCourseStatistics(String courseId, Long studentCount, Long completedCount);

    /**
     * 获取课程统计
     * 
     * @param courseId 课程ID
     * @return 统计信息
     */
    CourseStatisticsVO getCourseStatistics(String courseId);

    /**
     * 批量导入课程
     * 
     * @param courses 课程列表
     * @return 导入成功数量
     */
    Integer batchImportCourses(List<CourseCreateDTO> courses);

    /**
     * 导出课程
     * 
     * @param courseIds 课程ID列表
     * @return 导出数据
     */
    List<CourseVO> exportCourses(List<String> courseIds);

    /**
     * 复制课程
     * 
     * @param courseId 源课程ID
     * @param title 新课程标题
     * @return 新课程VO
     */
    CourseVO copyCourse(String courseId, String title);

    /**
     * 审核课程
     * 
     * @param courseId 课程ID
     * @param approved 是否通过
     * @param comment 审核意见
     * @return 是否成功
     */
    Boolean reviewCourse(String courseId, Boolean approved, String comment);
}
